let express = require("express");

// ****1-创建一个路由中间件，来管理 文章相关的路由

let router = express.Router();

let { User } = require("../model/index.js");

// ****2-在文章路由中间件 处理 文章相关的路由操作

// 1-获取所有文章，pagenum pagesize 分页，返回 接口 参数值
// get /articles?pagenum=1
router.get("/", async (req, res) => {
  let pagesize = req.query.pagesize || 10;
  let pagenum = req.query.pagenum || 1;
  let skip = (pagenum - 1) * pagesize;
  let limit = pagesize;
  let r = await User.find()
    .sort({ createdAt: -1 })
    .select({ password: 0 })
    .skip(skip)
    .limit(limit)
    .exec();

  res.json({
    params: req.query,
    msg: "-获取所有用户",
    data: r,
  });
});
// 2- 动态id根据文章id 获取文章详情，返回 接口作用，和 文章id
// get /articles/:id
router.get("/:uid", async (req, res) => {
  let r = await User.findById(req.params.uid).select({ password: 0 }).exec();

  res.json({
    params: req.params,
    msg: "动态id根据用户id 获取用户详情",
    data: r,
  });
});
// 3-根据文章id 删除文章 ，返回 接口作用和文章id
// delete /articles/:id
router.delete("/:uid", async (req, res) => {
  await User.findByIdAndDelete(req.params.uid);
  res.json({
    params: req.params,
    msg: "根据id 删除用户",
  });
});
// 4- patch-根据文章id 修改文章 ，返回 接口作用和文章id 和要修改的内容
// delete /articles/:id

router.patch("/:uid", async (req, res) => {
  // let token = req.headers["Authorization"];
  // let r = jwt.verify(token, "testaaaa", { algorithms: ["HS256"] });

  // { username: '123', id: 1, iat: 1688695368, exp: 1691287368 }
  console.log(req.auth);
  console.log(req.auth.id);
  await User.findByIdAndUpdate(req.params.uid, req.body);
  req.params;
  req.body;
  res.json({
    params: req.params,
    body: req.body,
    msg: "-根据id 修改用户信息 ",
  });
});
// 5- 发布文章
//  post请求    返回 接口作用和 和发布的内容 title content
//  {code:1,msg:'发布，发布的内容'}

router.post("/", (req, res) => {
  let u = new User(req.body);
  u.save()
    .then((r) => {
      res.json({
        body: req.body,
        msg: "注册成功 ",
        code: 1,
      });
    })
    .catch((err) => {
      res.json({
        body: req.body,
        msg: "注册失败，用户名已经存在 ",
        code: 0,
      });
    });
  // req.body;
  // 把用户名和密码 保存到 数据中  使用model 中indexjs文件中 User函数
});

/*
  cookie 和token的区别
    cookie 记录用户状态（登录或者未登录都可以） 浏览器得存（cookie），服务器也得存一份（session）
    token  登录成功返回，浏览器存入本地，服务器不需要存放

    jwt-》json web token  这种token 会 记录一个用户的信息 (把json数据 加密成一个 字符串)
       {id:1,username:'zahngsan}->12332asdfasdfasdp

*/

// ***jwt 的后端使用步骤
// 1-登录的生成

let jwt = require("jsonwebtoken");

/**
 * 测试使用---
 * @route POST /api/users/login
 * @group 用户模块 - 用户登录
 * @param {string} username.body.required -  or eusernamemail - eg: user@domain/用户账号
 * @param {string} password.body.required - user's password/用户密码.
 * @returns {object} 200 - {code:1,msg:'ok',data:null}
 * @returns {Error}  default - {code:0,msg:'error',data:null}
 */

let config = require("../config/common.js");
router.post("/" + "login", (req, res) => {
  req.body;
  if (
    req.body.username == config.adminUsername &&
    req.body.password == config.adminPassword
  ) {
    let token = jwt.sign({ username: req.body.username }, "testaaaa", {
      expiresIn: "30d",
      algorithm: "HS256",
    });

    res.json({
      // body: req.body,
      // uid: r._id,
      msg: "登录 成功 ",
      code: 1,
      token,
    });
  } else {
    res.json({
      body: req.body,
      msg: "登录 用户名或者密码不对 ",
      code: 0,
    });
  }

  // 判断
  // 查询用户名和请请求体相等 并且 密码和 请全体的密码相等
  User.findOne({
    username: req.body.username,
    password: req.body.password,
  }).then((r) => {
    console.log(r);
    // 判断r 是否为 null
    // if (r) {
    //   // 如果用户名和密码满足这个条件  就认为 登录成功，否则认为登录失败
    //   let token = jwt.sign(
    //     { username: req.body.username, id: r._id },
    //     "testaaaa",
    //     {
    //       expiresIn: "30d",
    //       algorithm: "HS256",
    //     }
    //   );

    //   res.json({
    //     // body: req.body,
    //     uid: r._id,
    //     msg: "登录 成功 ",
    //     code: 1,
    //     token,
    //   });
    // } else {
    //   res.json({
    //     body: req.body,
    //     msg: "登录 用户名或者密码不对 ",
    //     code: 0,
    //   });
    // }
  });
});

// ******3-导出文章路由中间件
module.exports = router;
